#include "main.h"
/*
    摄像头信息：
        分辨率      1920*1080
        帧率        30FPS
        ISP:        /etc/iqfiles
        输出格式：    NV12
        节点信息：    "rkispp_scale0"
    VENC信息：
        编码输入：  NV12
        编码输出：  H264
        编码等级：  极高(100)
        码率格式：  CBR(固定码率)
        码率速度：  1920*1080
        GOP组数：  30
*/

void Init_ISP(void)
{
	rk_aiq_working_mode_t hdr_mode = RK_AIQ_WORKING_MODE_NORMAL;
    int fps = 30;
    SAMPLE_COMM_ISP_Init(0, hdr_mode, RK_FALSE, "/oem/etc/iqfiles");
    SAMPLE_COMM_ISP_Run(0);
    SAMPLE_COMM_ISP_SetFrameRate(0, fps);
}

void  Venc_outcallback_function(MEDIA_BUFFER mb)
{       
    uint8_t * data = RK_MPI_MB_GetPtr(mb); 
    uint32_t size = RK_MPI_MB_GetSize(mb);
    //printf("ANEC数据！\r\n");
    if(h_info.video_net_status == true)
    {
        HELMET_MSG sendvideo_msg={
            .xyd="xyd",
        };
        sendvideo_msg.command = XYD_MSG_VIDEO;
        sendvideo_msg.data_length = size;
        sendvideo_msg.data_ptr = data;
        sendvideo_msg.device_id = h_info.device_id;
        sendvideo_msg.sum = sum_value(sendvideo_msg);
        mysock_write(h_info.sockfd,&sendvideo_msg,sizeof(sendvideo_msg));
        mysock_write(h_info.sockfd,sendvideo_msg.data_ptr,sendvideo_msg.data_length);
        printf("开发版发字节sendvideo_msg.data_length == %d\r\n",sendvideo_msg.data_length);
    }
    RK_MPI_MB_ReleaseBuffer(mb);
    size = size;
    data= data;
}   

void Init_MyCamera(void)
{
//1:初始化 摄像头 ISP调节 
	Init_ISP();
//2：RKMEdoia的初始化 
	RK_MPI_SYS_Init();

//3：VI通道的初始化 
	VI_CHN_ATTR_S vi_chn_attr = {0};
    vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;
	vi_chn_attr.pcVideoNode = video_node;
	vi_chn_attr.u32BufCnt = 4;
	vi_chn_attr.u32Width = 1920;
	vi_chn_attr.u32Height = 1080;
	vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
	vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;
	int ret = RK_MPI_VI_SetChnAttr(0, 0, &vi_chn_attr);
	ret = RK_MPI_VI_EnableChn(0, 0);	
	if(ret < 0)
	{
		exit(0);
	}
//4：VENC的创建
	VENC_CHN_ATTR_S venc_chn_attr;
	venc_chn_attr.stVencAttr.enType=RK_CODEC_TYPE_H264;
	venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;
	venc_chn_attr.stVencAttr.u32PicHeight = 1080;
	venc_chn_attr.stVencAttr.u32PicWidth = 1920;
	venc_chn_attr.stVencAttr.u32Profile = 77;
	venc_chn_attr.stVencAttr.u32VirHeight = 1080;
	venc_chn_attr.stVencAttr.u32VirWidth = 1920;

	venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
	venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;
	venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum =30;
	venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = 1920*1080;
	venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 30;
	venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;
	venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 30;
	RK_MPI_VENC_CreateChn(0,&venc_chn_attr);
    RK_MPI_VENC_CreateChn(1,&venc_chn_attr);
//5：VI->VENC的绑定
    MPP_CHN_S src,dst;
    src.enModId=RK_ID_VI;
    src.s32ChnId=0;
    src.s32DevId=0;
    dst.enModId = RK_ID_VENC;
    dst.s32ChnId=0;
    dst.s32DevId = 0;
    RK_MPI_SYS_Bind(&src,&dst);
//6:注册VENC 输出回调
    dst.enModId = RK_ID_VENC;
    dst.s32ChnId=1;
    dst.s32DevId = 0;
    RK_MPI_SYS_Bind(&src,&dst);
    ret = RK_MPI_SYS_RegisterOutCb(&dst,Venc_outcallback_function);
    if(ret < 0)
    {
        printf("注册输出回调函数失败\r\n");
    }

}



